#include <defs.h>
#include <stdio.h>
#include <console.h>

/* HIGH level console I/O *///是高级控制台输入输出的实现

/* *
 * cputch - writes a single character @c to stdout, and it will
 * increace the value of counter pointed by @cnt.
 * 定义了一个静态函数 cputch，用于将单个字符 c 写入标准输出，
 * 并增加 cnt 指向的计数器的值。
 * */
static void
cputch(int c, int *cnt) {
    cons_putc(c);//调用控制台输出函数将字符 c 输出到控制台。
    (*cnt) ++;//增加计数器的值，表示已经写入的字符数量。
}

/* *
 * vcprintf - format a string and writes it to stdout
 *
 * The return value is the number of characters which would be
 * written to stdout.
 *
 * Call this function if you are already dealing with a va_list.
 * Or you probably want cprintf() instead.
 * */
int
vcprintf(const char *fmt, va_list ap) {
    int cnt = 0;//初始化写入字符数量的计数器。
    vprintfmt((void*)cputch, &cnt, fmt, ap);//调用一个格式化输出的底层函数，使用 cputch 作为输出函数。
    return cnt;//返回写入的字符数量。
}

/* *
 * cprintf - formats a string and writes it to stdout
 *
 * The return value is the number of characters which would be
 * written to stdout.
 * */
int
cprintf(const char *fmt, ...) {
    va_list ap;//用于处理可变参数
    int cnt;
    va_start(ap, fmt);//初始化 ap，准备处理 fmt 后的可变参数。
    cnt = vcprintf(fmt, ap);//调用 vcprintf 进行格式化输出，并获得写入的字符数量。
    va_end(ap);//结束可变参数的处理。
    return cnt;//返回写入的字符数量。
}

/* cputchar - writes a single character to stdout */
//定义 cputchar 函数，用于将单个字符 c 写入标准输出。直接调用 cons_putc(c)。
void
cputchar(int c) {
    cons_putc(c);
}

/* *
 * cputs- writes the string pointed by @str to stdout and
 * appends a newline character.
 * 定义 cputs 函数，用于将字符串指针 str 指向的字符串写入标准输出，
 * 并在末尾附加换行符。
 * */
int
cputs(const char *str) {
    int cnt = 0;//初始化写入字符数量的计数器。
    char c;//用于存储当前字符。
    while ((c = *str ++) != '\0') {//循环：逐个读取字符串中的字符，直到遇到字符串结束符 \0。
        cputch(c, &cnt);//将当前字符写入输出并增加计数。
    }
    cputch('\n', &cnt);//写入换行符。
    return cnt;//返回写入的字符数量。
}

/* getchar - reads a single non-zero character from stdin */
//定义 getchar 函数，用于从标准输入读取单个非零字符.
int
getchar(void) {
    int c;//用于存储读取的字符。
    while ((c = cons_getc()) == 0)//调用 cons_getc() 从控制台获取字符，直到得到非零字符（即有效输入）。
        /* do nothing */;
    return c;//返回读取的字符。
}

